function test(){
    
   
}
function afunc(){
  function b(params) {
    var b = 3
    aa ='bbbb'
  }
  var aa = 'aaa'
  console.log(aa)
  b()
  console.log(aa)
}

afunc()

// 拿以上举例
// 此次执行上下文销毁没有了，下次再次执行 重新创建独一无二的执行上下文
// 7+  销毁执行AO
//  7 打印    a
//  -7  销毁执行BO{}
//  6  aa    赋值
//  5 b     赋值
//  4 b      执行BO{}
//  3 执行 aa 赋值
//  2 afunc  执行AO{}     
//  1 b      BO{}
//  0 afunc  A0{}

// a 被创建的时候 存是GO 也是 所在环境的 执行上下文  结构上来说 堆结构 后入先出
// a defined(被定义) a.[[scope]]==>a刚刚被定义的时候的时候0:GO{}      scope chain  //查找作用域链顶端依次向下查找
// a doing  a.[[scope]] ==> a执行的时候   0:BO{}                     0:BO{}
//                                      1:GO{}                      1:GO{}
// a 
console.log(test())
console.dir(test)

var a= 234
function demo(){
  var a= 345
  console.log(a)
  // 先找自己 再找外面
}



function Ab( ) {  
  function Ac() { 
    function Ad() { 
    }
    Ad()
   }
   Ac()

}
Ab()

//练习手写 执行上下文
// Ab defined 1.[[scope]] 0:GO{}
// Ab doing   a.[[scope]] 0:aAO{}
//                       1:GO{}
// Ac defined b.[[scope]] 0:aAO{}
//                        1:GO{}
// Ac doing b.[[scope]]   0:bAO{}
//                        1:aAO{}
//                        2:GO{}
// Ad defined c.[[scope]] 0:bAO{}     
//                        1:aAO{}
//                        2:GO{}
// Ad defined c.[[scope]] 0:cAO{}
//                        1:bAO{}
//                        2:aAO{}
//                        3:GO{}